import {formatDate, goodStorage} from "@/utils/index"

export const baseURL = 'https://apcxy.zzcyx.zzcyx1688.cn/'

export const zhiboURL = 'https://plugins-api.zzcyx1688.cn:8092/'
// H5域名
export const h5Url = 'https://chenyx.zzcyx1688.cn/zhennuoyouxuan'
/**
 * 后台请求报文结构
 */
export class ComReq{
  origin:string;
  data: any;
  constructor(data: any){
      this.data=data;
      this.origin="H5";
  }
}

/**
 * 后台响应报文结构
 */
export type ComResp<T>={
  data: T | PromiseLike<T>;
  code: string,
  message: string,
  body: T,
  show: number
}

// 添加拦截器
const httpInterceptor = {
  // 拦截前触发
  invoke(options: UniApp.RequestOptions) {
    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith('http')) {
      options.url =options.urlType=="live"?zhiboURL+options.url:baseURL + options.url
    }
    // 2. 请求超时, 默认 60s
    options.timeout = 30000
    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      'content-type': options.header?.['content-type']?options.header?.['content-type']:'application/x-www-form-urlencoded',
      'authorization':goodStorage.get('token')?'Bearer '+goodStorage.get('token'):''
    }
    // 4.统一封装请求后台数据结构
  },
}
uni.addInterceptor('request', httpInterceptor)
// uni.addInterceptor('uploadFile', httpInterceptor)


// 2.2 添加类型，支持泛型
export const http = <T>(options: UniApp.RequestOptions) => {
  // 1. 返回 Promise 对象
  return new Promise<T>((resolve, reject) => {
    uni.request({
      ...options,
      // 响应成功
      success(res) {
        // 状态码 2xx， axios 就是这样设计的
        uni.hideLoading()
        const result=res.data as ComResp<T>
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 2.1 提取核心数据 res.data
          if(result.code=='200'){
            if(options.urlType=='live'){
              resolve(result.data) 
            }else{
              resolve(result.body)
            }
          }else{
            uni.showToast({
              icon: 'none',
              title: result.message || '接口响应错误',
            })
            reject(result)
          }
        }else if(res.statusCode==401){
          goodStorage.remove('token')
          goodStorage.remove('dataUser')
          goodStorage.remove('routerInfo')
          goodStorage.remove('storeInfo')
          uni.showToast({
            icon: 'none',
            title: result.message || '登录失效，请重新登录',
          })
          setTimeout(()=>{
            uni.reLaunch({ url: '/pages/login/login' })
          },1000)
        } else {
          // 其他错误 -> 根据后端错误信息轻提示
          uni.showToast({
            icon: 'none',
            title: (res.data as ComResp<T>).message || '请求错误',
          })
          reject(res)
        }
      },
      // 响应失败
      fail(err) {
        uni.showToast({
          icon: 'none',
          title: '网络错误，换个网络试试',
        })
        reject(err)
      },
    })
  })
}

